﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SegIdenPC.Entidad;
using SegIdenPC.Herramientas;
using log4net;
using GS1.Utilitario;
using System.Drawing.Imaging;
using System.Configuration;
using SegIdenPC.Utilitarios;
using System.Diagnostics;


namespace SegIdenPC.Formularios
{
    public partial class frmReporteProveedor : Form
    {
        #region --- Variables y Propiedades ---
        private static readonly ILog log = LogManager.GetLogger(typeof(frmReporteProveedor));

        private const string LLAVE_RUTAIMAGEN = "RUTAARCHIVO";

        private const string TITULO = "Reporte Proveedor";
        private const string FORMATO_TOTAL_ENCONTRADOS = "Total registros: {0}";

        private string RUTA_ARCHIVO_TEMPORAL = ConfigurationManager.AppSettings[LLAVE_RUTAIMAGEN];
        private const string APLICACION_EXCEL = "excel.exe";

        private const string FORMATO_PRODUCTO_DESCRIPCION_DETALLADA = "{0} - {1} - {2} - {3}";

        private ListaPais paises = null;
        private Nivel niveles = null;
        private ReporteProveedor reporteProveedor = null;
                

        #endregion

        #region --- Constructor ---
        public frmReporteProveedor()
        {
            InitializeComponent();
        }
        #endregion

        #region --- Eventos Formulario ---

        private void frmReporteProveedor_Load_1(object sender, EventArgs e)
        {
            cargarFormulario();
        }

         private void tbtnImprimir_Click(object sender, EventArgs e)
        {
            exportarData();
        }

        private void tbtnSalir_Click(object sender, EventArgs e)
        {
            salir();
        }

        private void tbtnVer_Click(object sender, EventArgs e)
        {
            ejecutarReporte();
        }


        private void cboCriterioNivelProducto_SelectedIndexChanged(object sender, EventArgs e)
        {
            seleccionNivelesBusqueda();
        }

        
        #endregion

        #region --- Metodos Propios ---

        private void cargarPaises()
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_LISTAR_PAIS;

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                return;
            }

            // Obteniendo Objeto de ListaMoneda (Monedas)
            this.paises = contenidoXML.DeserializarTo<ListaPais>();

            // Estableciendo listado de paises
            this.cboDesPais.DataSource = this.paises.lista;
            this.cboDesPais.ValueMember = "codPais";
            this.cboDesPais.DisplayMember = "desPais";
            this.cboDesPais.SelectedIndex = 0;

            // Creando listado para registro de moneda
            ListaPais listaPais = new ListaPais();
            //listaMoneda.add(new Moneda { codPais = Constantes.CODIGO_SELECCIONE, desPais = Constantes.DESCRIPCION_SELECCIONE });

            foreach (Pais pais in this.paises.lista)
            {
                listaPais.add(new Pais { codPais = pais.codPais, desPais = pais.desPais });
            }

        }

        private void cargarFormulario()
        {
            ListaGeneral listaReporte = null;
            cargarPaises();
            try
            {
                Cursor.Current = Cursors.WaitCursor;

                // Instanciando y creando listado de estado
                listaReporte = new ListaGeneral();
                listaReporte.Add(new General { codigo = "0", descripcion = "---Seleccione---" });
                listaReporte.Add(new General { codigo = Constantes.REPORTE_PROVEEDORXPAIS, descripcion = Constantes.REPORTE_DESCRIPCION_PROVEEDORXPAIS });

                //poblando lista de reportes
                this.cboReportes.DataSource = listaReporte;
                this.cboReportes.ValueMember = Constantes.GENERAL_CODIGO;
                this.cboReportes.DisplayMember = Constantes.GENERAL_DESCRIPCION;
                this.cboReportes.SelectedIndex = 0;

                // Ejecutar carga del combo Niveles
                cargarNiveles();

             }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }
        }

        private void cargarNiveles()
        {
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_LISTAR_NIVELES;

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                return;
            }

            // Obteniendo Objeto de Nivel
            this.niveles = contenidoXML.DeserializarTo<Nivel>();

            // Estableciendo listado de nivel de producto
            this.cboCriterioNivelProducto.DataSource = this.niveles.listaNivelProducto.lista;
            this.cboCriterioNivelProducto.ValueMember = Constantes.GENERAL_CODIGO;
            this.cboCriterioNivelProducto.DisplayMember = Constantes.GENERAL_DESCRIPCION;
            this.cboCriterioNivelProducto.SelectedIndex = 0;

            // Creando listado para nivel de producto para busqueda
            ListaNivelProducto listaNivelProducto = new ListaNivelProducto();
            listaNivelProducto.add(new NivelProducto { codigo = Constantes.CODIGO_SELECCIONE, descripcion = Constantes.DESCRIPCION_SELECCIONE });

            foreach (NivelProducto nivelProducto in this.niveles.listaNivelProducto.lista)
            {
                listaNivelProducto.add(new NivelProducto { codigo = nivelProducto.codigo, descripcion = nivelProducto.descripcion });
            }

            // Estableciendo listado de nivel de producto para busqueda
            this.cboCriterioNivelProducto.DataSource = listaNivelProducto.lista;
            this.cboCriterioNivelProducto.ValueMember = Constantes.GENERAL_CODIGO;
            this.cboCriterioNivelProducto.DisplayMember = Constantes.GENERAL_DESCRIPCION;
            this.cboCriterioNivelProducto.SelectedIndex = 0;
        }


        private void seleccionNivelesBusqueda()
        {
            string codigoNivelProducto = string.Empty;

            if (this.cboCriterioNivelProducto.SelectedValue is string)
            {
                codigoNivelProducto = this.cboCriterioNivelProducto.SelectedValue.ToString();
            }
            else
            {
                codigoNivelProducto = ((NivelProducto)this.cboCriterioNivelProducto.SelectedValue).codigo;
            }

            List<NivelTipo> listaNivelTipo = this.niveles.listaNivelTipo.lista;
            
            List<NivelTipo> listaSeleccionNivelTipo = new List<NivelTipo>();
            listaSeleccionNivelTipo.Add(new NivelTipo { codigo = Constantes.CODIGO_SELECCIONE, descripcion = Constantes.DESCRIPCION_SELECCIONE });

            
            var listaTipo = (from item in listaSeleccionNivelTipo
                             select item).
                            Union
                            (from itemTipo in listaNivelTipo
                             where itemTipo.codNivelProducto == codigoNivelProducto
                             select itemTipo);
           
            
            this.cboCriterioNivelTipo.DataSource = listaTipo.ToList<NivelTipo>();
            this.cboCriterioNivelTipo.ValueMember = Constantes.GENERAL_CODIGO;
            this.cboCriterioNivelTipo.DisplayMember = Constantes.GENERAL_DESCRIPCION;     
        }



        private void ejecutarReporte()
        {
            switch (this.cboReportes.SelectedValue.ToString())
            {
                case Constantes.REPORTE_PROVEEDORXPAIS:
                    obtieneReporteProveedorxPais();
                    break;
                default:
                    break;
            }
        }   

        private void obtieneReporteProveedorxPais()
        {

            Operacion operacion = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_OBTENER_REPORTE_PROVEEDORXPAIS;
          
            operacion.reporteSolicitud = new ReporteSolicitud();
            operacion.reporteSolicitud.pais = new Pais();
            operacion.reporteSolicitud.pais.codPais = Convert.ToInt32(this.cboDesPais.SelectedValue.ToString());
            operacion.reporteSolicitud.nivelTipo = new NivelTipo();
            operacion.reporteSolicitud.nivelTipo.codNivelProducto = this.cboCriterioNivelProducto.SelectedValue.ToString();
            operacion.reporteSolicitud.nivelTipo.codigo = this.cboCriterioNivelTipo.SelectedValue.ToString();


            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                return;
            }

            this.reporteProveedor = contenidoXML.DeserializarTo<ReporteProveedor>(); 

            //poblar la grilla
            poblarGrilla();
        }

               
       private void poblarGrilla()
        {
            ListaLineaReporteProveedor nuevaListaLineaReporteProveedor = new ListaLineaReporteProveedor();

            this.dgvListado.AutoGenerateColumns = false;

            if (this.cboDesPais.Text != "")
            {
                foreach (LineaReporteProveedor LineaReporteProveedorActual in reporteProveedor.listaLineaReporteProveedor.lista)
                {
                    //if (LineaReporteInventarioActual == txtCodigoInventario.Text) /
                    //{
                    nuevaListaLineaReporteProveedor.add(LineaReporteProveedorActual);
                    //}
                }

                this.dgvListado.DataSource = nuevaListaLineaReporteProveedor == null ?
                                                     new ListPersonalizada<LineaReporteProveedor>() :
                                                     nuevaListaLineaReporteProveedor.lista;

            }
            else
            {
                this.dgvListado.DataSource = reporteProveedor.listaLineaReporteProveedor == null ?
                                                      new ListPersonalizada<LineaReporteProveedor>() :
                                                      reporteProveedor.listaLineaReporteProveedor.lista;


            }

            pintarGrilla(this.dgvListado);

        }

        private void pintarGrilla(DataGridView grilla)
        {
            ListPersonalizada<LineaReporteProveedor> listaLineaReporteProveedor = null;
            listaLineaReporteProveedor = (ListPersonalizada<LineaReporteProveedor>)grilla.DataSource;

            if (listaLineaReporteProveedor != null)
            {
                for (int i = 0; i < listaLineaReporteProveedor.Count; i++)
                {
                    LineaReporteProveedor lineaReporteProveedor = listaLineaReporteProveedor[i];
                    this.dgvListado.Rows[i].Cells[0].Value = lineaReporteProveedor.proveedor.codProveedor;
                    this.dgvListado.Rows[i].Cells[1].Value = lineaReporteProveedor.proveedor.razonSocial;
                    this.dgvListado.Rows[i].Cells[2].Value = lineaReporteProveedor.proveedor.observacion;
                    this.dgvListado.Rows[i].Cells[3].Value = lineaReporteProveedor.proveedor.direccion;
        ;
                }
            }
        }

        private void exportarData()
        {
            if (this.dgvListado.DataSource == null)
            {
                ejecutarReporte();
            }

            ExportarExcel exportarExcel = null;

            try
            {
                // Si no hay informacion en la grilla entoncesa salir
                if (this.dgvListado.Rows.Count <= 0) { return; }

                // Si hay informacion entonces generar archivo
                exportarExcel = new ExportarExcel();
                String sNombreArchivo = "";
                switch (this.cboReportes.SelectedValue.ToString())
                {
                    case Constantes.REPORTE_PROVEEDORXPAIS:
                        sNombreArchivo = RUTA_ARCHIVO_TEMPORAL + "\\REPORTE_PROVEEDORXPAIS." + DateTime.Now.ToString(Constantes.FORMATO_FECHAHORA_ARCHIVO) + ".xls";
                        break;
                      default:
                        break;
                }

                exportarExcel.crearExcelTabla(sNombreArchivo, this.dgvListado);

                // Abrir archivo generado
                ProcessStartInfo psi = new ProcessStartInfo(APLICACION_EXCEL, RUTA_ARCHIVO_TEMPORAL);
                Process p = Process.Start(psi);
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, this.Text);
            }
        }


        private void salir()
        {
            this.Close();
        }


        #endregion
    }
}
